home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-03-02 | 10.5 KB | 384 lines | [TEXT/CWIE] |
- // READ THIS!
- // the code in this file is ***almost identical*** to that in CustomerFuncs.c
- // as such, it has not been heavily annotated. There is a
- // function by function correspondence between the two files.
-
-
- //handle Part window stuff.
- #include "InvoiceGlobals.h"
- #include "BTreeDef.h"
- #include "BTreeProtos.h"
- #include "SampleHeader.h"
- #include "Actions.h"
-
- //some vars local to this file
- static short itemType;
- static Handle item;
- static Rect box;
- static Str255 itemString;
- static short ScratchShort;
- static long ScratchLong;
- //FindType = 1 means by num, 2 by name
-
- Str255 PartSearchNameP;
- Str255 PartFoundNameP;
- long PartSearchNumP;
- long PartFoundNumP;
- FileAddr PartCurrentAddr;
- short gPartFindType = kFindByName;
-
- #define kPopUp 6
- #define kPartPopUp 5
- #define kDoIt 1
-
- //two utility functions; makes life much easier
-
- void GetFromPartDialog(void);
- void PutToPartDialog(void);
-
-
- //the heart of the matter
-
- short FindPartByNumber(void);
- short FindPartByName(void);
- short PartFindNextPrev(short direction);
- short PartInsert(void);
- short PartEdit(void);
- short PartDelete(void);
-
-
- extern void HandleErrorMsg(short theErr);
-
-
- void GetFromPartDialog(void){
- //Part name id = 2
- //Part num id = 3
- //Part price id = 4
- GetDialogItem(gPartDialog, 2, &itemType, &item, &box);
- GetDialogItemText(item, itemString);
- ScratchShort = (short)itemString[0];
- if (ScratchShort>31)
- ScratchShort = 31;
- BlockMove(itemString,gPart.PartName, ScratchShort+1);
- GetDialogItem(gPartDialog, 3, &itemType, &item, &box);
- GetDialogItemText(item, itemString);
- StringToNum(itemString,&ScratchLong);
- gPart.PartNo = ScratchLong;
- GetDialogItem(gPartDialog, 4, &itemType, &item, &box);
- GetDialogItemText(item, itemString);
- ScratchShort = (short)itemString[0];
- if (ScratchShort>5)
- ScratchShort = 5;
- BlockMove(itemString,gPart.PartPrice, ScratchShort+1);
- }
-
- void PutToPartDialog(void){
- //Part name id = 2
- //Part num id = 3
- //Part price id = 4
- GrafPtr oldPort;
- GetPort(&oldPort);
- SetPort((GrafPtr)gPartDialog);
- GetDialogItem(gPartDialog, 2, &itemType, &item, &box);
- ScratchShort = (short)(gPart.PartName[0]);
- if (ScratchShort>31)
- ScratchShort = 31;
- BlockMove(gPart.PartName,itemString, ScratchShort+1);
- SetDialogItemText(item, itemString);
- SetDialogItem(gPartDialog, 2, itemType, item, &box);
- InvalThisItemRect(gPartDialog,2);
- GetDialogItem(gPartDialog, 3, &itemType, &item, &box);
- ScratchLong = gPart.PartNo;
- NumToString(ScratchLong,itemString);
- SetDialogItemText(item, itemString);
- SetDialogItem(gPartDialog, 3, itemType, item, &box);
- InvalThisItemRect(gPartDialog,3);
- GetDialogItem(gPartDialog, 4, &itemType, &item, &box);
- ScratchShort = (short)(gPart.PartName[0]);
- if (ScratchShort>5)
- ScratchShort = 5;
- BlockMove(gPart.PartPrice,itemString, ScratchShort+1);
- SetDialogItemText(item, itemString);
- SetDialogItem(gPartDialog, 4, itemType, item, &box);
- InvalThisItemRect(gPartDialog,4);
- BeginUpdate(gPartDialog);
- DrawDialog(gPartDialog);
- EndUpdate(gPartDialog);
- SetPort(oldPort);
- }
-
- //these two functions could easily be made into one
- //do it in two for demonstrative purposes
- short FindPartByNumber(void){
- short FindErr= noErr;
- short StringSize;
- FileAddr foundAddr;
-
- GetFromPartDialog();
- PartSearchNumP = gPart.PartNo;
- gPartFindType = kFindByNumber;
- FindErr = Find_Equal(kPartNumTree,gInvoiceFCH,(Ptr)&PartSearchNumP,(Ptr)&PartFoundNumP,&foundAddr,kLongCompare);
- if (FindErr != noErr) {
- HandleErrorMsg(FindErr);
- return FindErr;
- };
- FindErr = Read_Data(gInvoiceFCH, kPartSize,foundAddr,(Ptr)&gPart);
- if (FindErr != noErr) {
- HandleErrorMsg(FindErr);
- return FindErr;
- };
- PutToPartDialog();
- PartSearchNumP = PartFoundNumP;
- PartCurrentAddr = foundAddr;
- return FindErr;
- }
-
- short FindPartByName(void){
- short FindErr= noErr;
- short StringSize;
- FileAddr foundAddr;
-
- GetFromPartDialog();
- StringSize = gPart.PartName[0];
- if (StringSize>31)
- StringSize = 31;
- BlockMove((Ptr)gPart.PartName,(Ptr)PartSearchNameP,StringSize+1);
- gPartFindType = kFindByName;
- FindErr = Find_Equal(kPartNameTree,gInvoiceFCH,(Ptr)PartSearchNameP,(Ptr)PartFoundNameP,&foundAddr,kPStringCompare);
- if (FindErr != noErr) {
- HandleErrorMsg(FindErr);
- return FindErr;
- };
- FindErr = Read_Data(gInvoiceFCH, kPartSize,foundAddr,(Ptr)&gPart);
- if (FindErr != noErr) {
- HandleErrorMsg(FindErr);
- return FindErr;
- };
- PutToPartDialog();
- BlockMove((Ptr)PartFoundNameP,(Ptr)PartSearchNameP, 256);
- PartCurrentAddr = foundAddr;
- return FindErr;
- }
-
- short PartFindNextPrev(short direction){
- short FindErr = noErr;
- FileAddr foundAddr;
- FileAddr prevAddr;
- short TreeNo;
- Ptr SearchP;
- Ptr FoundP;
- CompareProcPtr Comparison;
-
- if (gPartFindType == kFindByNumber) {
- SearchP = (Ptr)&PartSearchNumP;
- FoundP = (Ptr)&PartFoundNumP;
- TreeNo = kPartNumTree;
- Comparison = kLongCompare;
- prevAddr = PartCurrentAddr;
- }
- else {
- SearchP = (Ptr)PartSearchNameP;
- FoundP = (Ptr)PartFoundNameP;
- TreeNo = kPartNameTree;
- Comparison = kPStringCompare;
- prevAddr = PartCurrentAddr;
- };
-
- if (direction == kNext)
- FindErr = Find_Next(TreeNo, gInvoiceFCH, SearchP, prevAddr, FoundP, &foundAddr, Comparison);
- else
- FindErr = Find_Previous(TreeNo, gInvoiceFCH, SearchP, prevAddr, FoundP, &foundAddr, Comparison);
- if (FindErr != noErr) {
- HandleErrorMsg(FindErr);
- return FindErr;
- };
- FindErr = Read_Data(gInvoiceFCH, kPartSize,foundAddr,(Ptr)&gPart);
- if (FindErr != noErr) {
- HandleErrorMsg(FindErr);
- return FindErr;
- };
- PutToPartDialog();
- PartCurrentAddr = foundAddr;
- if (gPartFindType == kFindByNumber)
- PartSearchNumP = PartFoundNumP;
- else
- BlockMove((Ptr)PartFoundNameP,(Ptr)PartSearchNameP, 256);
- return FindErr;
- }
-
- short PartInsert(void) {
- short InsertErr = noErr;
- FileAddr InsertAddr;
- short AlertReturn;
- short StringSize;
- //first,check and make sure that the proposed ID number is not in the tree
- GetFromPartDialog();
- PartSearchNumP = gPart.PartNo;
- InsertErr = Find_Equal(kPartNumTree,gInvoiceFCH,(Ptr)&PartSearchNumP,(Ptr)&PartFoundNumP,&InsertAddr,kLongCompare);
- if (PartSearchNumP == PartFoundNumP) {
- AlertReturn = CautionAlert(130, NULL);
- InsertErr = paramErr;
- return paramErr;
- };
- //get file space
- InsertErr = Get_Bytes(gInvoiceFCH, &InsertAddr, kPartSize);
- if (InsertErr != noErr) {
- HandleErrorMsg(InsertErr);
- return InsertErr;
- };
- //write the record to file
- InsertErr = Write_Data(gInvoiceFCH, kPartSize, InsertAddr, (Ptr)&gPart);
- if (InsertErr != noErr) {
- HandleErrorMsg(InsertErr);
- return InsertErr;
- };
- //insert the keys
- InsertErr = Insert_Key(kPartNumTree, kUniqueKeys, gInvoiceFCH,(Ptr)&PartSearchNumP, InsertAddr, kLongCompare);
- if (InsertErr != noErr) {
- HandleErrorMsg(InsertErr);
- return InsertErr;
- // if for real, should also delete the record and release file space if failed insertion
- };
- StringSize = gPart.PartName[0];
- if (StringSize>31)
- StringSize = 31;
- BlockMove((Ptr)gPart.PartName,(Ptr)PartSearchNameP,StringSize+1);
- InsertErr = Insert_Key(kPartNameTree, kDuplicateKeys, gInvoiceFCH,(Ptr)&PartSearchNameP, InsertAddr, kPStringCompare);
- if (InsertErr != noErr) {
- HandleErrorMsg(InsertErr);
- return InsertErr;
- // if for real, should also delete the record and release file space if failed insertion
- };
- PartCurrentAddr = InsertAddr;
- return InsertErr;
- }
-
- short PartEdit(void) {
- short EditErr = noErr;
- short AlertReturn;
- FileAddr EditAddr;
- //the record in the "main buffer" should be moved to a secondary buffer
- PartType PartEdit;
-
- BlockMove(&gPart,&PartEdit,kPartSize);
- GetFromPartDialog();
- // to protect data integrity, the ID # cannot be edited
- // thus, only the strings need to be compared.
- // more complex approach would be needed in real app
- // if strings different, insert new record, edit the key string
- if (!EqualString(gPart.PartName, PartEdit.PartName, TRUE, FALSE)) {
- EditAddr = PartCurrentAddr;
- //overwrite the old data
- EditErr = Write_Data(gInvoiceFCH, kPartSize, EditAddr, (Ptr)&gPart);
- if (EditErr != noErr) {
- HandleErrorMsg(EditErr);
- return EditErr;
- };
- //Very Important. Delete the old key
- EditErr = Delete_Key(kPartNameTree,kDuplicateKeys, gInvoiceFCH, (Ptr)PartEdit.PartName, &EditAddr, kPStringCompare);
- if (EditErr != noErr) {
- HandleErrorMsg(EditErr);
- return EditErr;
- };
- //Insert the new Key
- EditErr = Insert_Key(kPartNameTree, kDuplicateKeys, gInvoiceFCH,(Ptr)gPart.PartName, EditAddr, kPStringCompare);
- if (EditErr != noErr) {
- HandleErrorMsg(EditErr);
- return EditErr;
- };
- };
- PartCurrentAddr = EditAddr;
- BlockMove((Ptr)gPart.PartName,(Ptr)PartSearchNameP, 256);
- return EditErr;
- }
-
- short PartDelete(void) {
- short DeleteErr = noErr;
- short AlertReturn;
- FileAddr DeleteAddr;
- //assumes that a found, insert, edit done so there is a current record in buffer.
- DeleteAddr = PartCurrentAddr;
- //release keys first. better to have orphan record than keys pointing to nowhere
- DeleteErr = Delete_Key(kPartNameTree,kDuplicateKeys, gInvoiceFCH, (Ptr)gPart.PartName, &DeleteAddr, kPStringCompare);
- if (DeleteErr != noErr) {
- HandleErrorMsg(DeleteErr);
- return DeleteErr;
- };
- DeleteErr = Delete_Key(kPartNumTree,kUniqueKeys, gInvoiceFCH, (Ptr)gPart.PartNo, &DeleteAddr, kLongCompare);
- if (DeleteErr != noErr) {
- HandleErrorMsg(DeleteErr);
- return DeleteErr;
- };
- //release space in file
- DeleteErr = Release_Bytes(gInvoiceFCH, DeleteAddr, kPartSize);
- if (DeleteErr != noErr) {
- HandleErrorMsg(DeleteErr);
- return DeleteErr;
- };
- PartCurrentAddr = noAddr;
- gPart.PartName[0] = 0;
- gPart.PartNo = 0;
- PutToPartDialog();
- return DeleteErr;
- }
-
- void HandlePartAction(EventRecord *theEvent, short *theItem){
- short PartErr;
- ControlHandle popControl;
- short popValue;
- switch (*theItem) {
- case kPartPopUp:
- popControl = GetCtlHandle(gPartDialog,kPartPopUp);
- popValue = GetControlValue(popControl);
- switch (popValue) {
- case kFindByName:
- gPartAction = kFindByName;
- break;
- case kFindByNumber:
- gPartAction = kFindByNumber;
- break;
- case kNext:
- gPartAction = kNext;
- break;
- case kPrevious:
- gPartAction = kPrevious;
- break;
- case kInsert:
- gPartAction =kInsert;
- break;
- case kEdit:
- gPartAction = kEdit;
- break;
- case kDelete:
- gPartAction = kDelete;
- break;
- };//popup value switch
- break; //popup
-
- case kDoIt:
- switch (gPartAction) {
- case kFindByName:
- PartErr = FindPartByName();
- break;
- case kFindByNumber:
- PartErr = FindPartByNumber();
- break;
- case kNext:
- PartErr = PartFindNextPrev(kNext);
- break;
- case kPrevious:
- PartErr = PartFindNextPrev(kPrevious);
- break;
- case kInsert:
- PartErr =PartInsert();
- break;
- case kEdit:
- PartErr = PartEdit();
- break;
- case kDelete:
- PartErr = PartDelete();
- break;
- };//gPartAction switch
- break;
- }//switch
- }//function